package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.dto.Location;
import com.xxxtea.mpe.handler.AttachmentHandler;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Date;

/**
 * 用户实体类
 * 
 * 用于存储用户的基本信息，包括：
 * - 用户基本信息（账号、密码、昵称等）
 * - 用户头像管理
 * - 用户角色和状态管理
 * - 信用分和位置信息
 * - 账户锁定管理
 * 
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 * 
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("用户")
@TableName(autoResultMap = true)
public class User {

	/**
	 * 用户ID
	 * 使用自增策略
	 */
	@ApiModelProperty("用户ID")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 用户账号
	 * 用户的登录账号
	 */
	@ApiModelProperty("账号")
	private String username;

	/**
	 * 用户密码
	 * 用户的登录密码（加密存储）
	 */
	@ApiModelProperty("密码")
	private String password;

	/**
	 * 用户昵称
	 * 用户的显示昵称
	 */
	@ApiModelProperty("昵称")
	private String nickname;

	/**
	 * 用户头像
	 * 使用自定义处理器处理头像附件
	 */
	@ApiModelProperty("头像")
	@TableField(typeHandler = AttachmentHandler.class)
	private Attachment avatar;

	/**
	 * 电子邮箱
	 * 用户的邮箱地址
	 */
	@ApiModelProperty("电子邮箱")
	private String email;

	/**
	 * 电话号码
	 * 用户的手机号码
	 */
	@ApiModelProperty("电话号码")
	private String phone;

	/**
	 * 用户角色
	 * 1-用户 2-商家 3-管理员
	 * 使用枚举类型管理角色
	 */
	@ApiModelProperty("角色 1-用户 2-商家 3-管理员")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private Role role;

	/**
	 * 用户状态
	 * 0-禁用 1-正常
	 * 使用枚举类型管理状态
	 */
	@ApiModelProperty("状态 0-禁用 1-正常")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private Status status;

	/**
	 * 信用分
	 * 用户的信用评分
	 */
	@ApiModelProperty("信用分")
	private Double creditScore;

	/**
	 * 账户冻结时间
	 * 用户账户被锁定的时间
	 */
	@ApiModelProperty("冻结时间")
	private Date lockTime;

	/**
	 * 用户位置信息
	 * 用户的当前位置坐标
	 */
	private Location location;

	/**
	 * 创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 用户令牌
	 * 非数据库字段，用于身份验证
	 */
	@TableField(exist = false)
	private String token;

	/**
	 * 用户角色枚举
	 * 定义用户的各种角色
	 */
	@Getter
	@AllArgsConstructor
	public enum Role implements BaseEnum<Role> {
		/**
		 * 普通用户角色
		 */
		USER(1, "用户"),
		/**
		 * 商家角色
		 */
		MERCHANT(2, "商家"),
		/**
		 * 管理员角色
		 */
		ADMIN(3, "管理员"),
		;
		private final Integer value;
		private final String label;
	}

	/**
	 * 用户状态枚举
	 * 定义用户的各种状态
	 */
	@Getter
	@AllArgsConstructor
	public enum Status implements BaseEnum<Status> {
		/**
		 * 禁用状态
		 */
		DISABLE(0, "禁用"),
		/**
		 * 正常状态
		 */
		ENABLE(1, "正常"),
		;
		private final Integer value;
		private final String label;
	}
}